사이트 내 전체검색
OpenVPN을 이용한 VPN 환경 구축
로빈아빠
https://cmd.kr/server/611 URL이 복사되었습니다.

본문

OpenVPN을 이용한 VPN 환경 구축

OpenVPN은 오픈 소스 프로그램으로 TUN/TAP방식의 가상 사설망을 구축할 수 있도록 한다. OpenSSH 보다는 좀 더 복잡하다는 단점이 있지만, 운영체제에 상관없이 설치할 수 있다는 장점이 있다. 여기에서는 routed VPN 이라고도 불리는 tun방식으로 구축할 것이다. 

OpenVPN은 SSL기반의 VPN으로 openssl라이브러리를 사용한다. 

pub?id=1uZt54osFslzbb_7-7vognDUUbU4KwMA6gcUSdnC-Gi0&w=641&h=329 
TUN 방식은 운영체제에 가상의 네트워크 디바이스를 만든다. 이 디바이스의 이름은 tun으로 흔히 tun 디바이스 라고 한다. OpenVPN 서버가 설치되는 컴퓨터는 이를테면 가상 사설망을 관리하는 라우터가 되는 셈이다. OpenVPN 클라이언트 역시 tun 디바이스가 만들어 지고, 이 가상 디바이스를 이용해서 VPN 서버의 tun 인터페이스에 연결 된다.

위의 그림은 OpenVPN 서버와 클라이언트에 tun 디바이스가 만들어지고, 이 디바이스를 이용해서 10.8.0.0 주소영역을 가지는 사설망이 만들어 진것을 보여준다. 

TUN방식은 다음과 같은 장점을 가진다. 
  • 네트워크 디바이스를 생성함으로써, 네트워크 구조가 명확하고 비교적 안정적으로 작동한다는 장점을 가진다. 
  • 고정 IP를 할당할 수 있어서 위치에 관계 없이 안정적으로 사설망을 유지할 수 있도록 한다. 
  • 사설망을 위한 DHCP, 네임서버를 구축할 수 있다. 

1.1 테스트 환경

VPN를 제대로 테스트 하려면 최대한 3대의 컴퓨터가 필요할 것이다. 그러나 굳이 그럴 필요가 없다. PC 가상화 솔류션이 있기 때문이다. 나는 PC 가상화 솔류션 중 하나인 VirtualBox를 이용 해서 VPN 테스트 환경을 만들었다. 가상화 솔류션 참 좋다. 하나의 PC로 다양한 테스트를 할 수 있다. 

호스트 운영체제는 우분투 리눅스 10.04 이며, 게스트 운영체제로는 Windows XP와 우분투 리눅스를 설치했다. 이 환경에서 VPN 테스트를 할 것이다. 

pub?id=1QJuQIgA5_ks7ii1csfwg5i7Gygbz4Yg7oiluarj8vRs&w=678&h=280 

1.2 OpenVPN 서버 설치

VPN GW에 해당 하는 OpenVPN 서버를 설치하고 설정하는 과정을 정리한다. 우분투 리눅스 10.0.4를 기준으로 한다.
  1. openvpn 패키지를 설치한다.

    # sudo apt-get install openvpn 
     
  2. openvpn의 설정파일의 위치를 지정한다. /etc/openvpn으로 했다. 

    # echo "AUTOSTART=\"openvpn\"" >> /etc/default/openvpn 
     
  3. ras 설정을 해야 한다. 상당히 복잡한 과정이지만, openvpn설치시 제공되는 예제 파일을 이용해서 비교적 간단히 설치할 수 있다.

    # cp -r /usr/share/doc/openvpn/examples/easy-rea/ /etc/openvpn  
     
  4. var 파일은 ras 설정을 위한 환경 변수를 담고 있다. source명령을 이용해서 환경을 설정한다.

    # source /etc/openvpn/easy-rsa/2.0/vars 
     
  5. private key를 만든다. 이제 부터 작업 디렉토리는 /etc/openvpn/easy-rsa/2.0이다. Sign the certificate와 1 out of 1 certificate ...는 모두 y를 선택한다.

    root:/etc/openvpn/easy-rsa/2.0# ./build-ca  
    Generating a 1024 bit RSA private key 
    ....++++++ 
    ...............................++++++ 
    writing new private key to 'ca.key' 
    ----- 
    .... 
    .... 
     
    Sign the certificate? [y/n]:y 
    1 out of 1 certificate requests certified, commit? [y/n]y 
     
  6. 서버 key를 만든다. 역시 Sign the...와 1 out of 1 certi...를 y로 한다. 

    # root:/etc/openvpn/easy-rsa/2.0# ./build-key-server server 
    Generating a 1024 bit RSA private key                                                            
    ................++++++ 
    ......................++++++                                                                     
    writing new private key to 'server.key' 
    -----                                                                                            
    .... 
    .... 
    .... 
    Sign the certificate? [y/n]:y 
    1 out of 1 certificate requests certified, commit? [y/n]y 
     
  7. client key를 만든다. 계정/암호 인증방식이 아닌 key를 이용한 인증방식시 사용한다. 이 키를 클라이언트에 배포하면, 클라이언트는 계정/암호 없이 서버에 연결할 수 있다. 키는 말그대로 서버에 드나들기 위한 열쇠이므로 배포시 보안에 주의해야 한다. 메일이나 ftp등으로 배포하는 일이 없도록 한다. client key는 클라이언트마다 필요하다. 그러므로 만약 100명의 클라이언트를 관리해야 한다면, 100개의 client key를 만들어야 한다. yundream이라는 이름의 client key를 만들기로 했다. 위의 키 생성과정과 동일하다.

    #root:/etc/openvpn/easy-rsa/2.0# ./build-key yundream  
     
  8. Diffie Hellman 파라메터를 생성한다. 

    root@yundream-laptop:/etc/openvpn/easy-rsa/2.0# ./build-dh  
    Generating DH parameters, 1024 bit long safe prime, generator 2 
    This is going to take a long time 
    ....................................... 
     
이로서 서버측 설정을 마치고, yundream사용자를 위한 key도 만들었다. yundream 사용자에게 아래의 key를 배포하면 된다. 
ca.crt 
yundream.crt 
yundream.key 
 

1.3 OpenVPN 서버 설정

이제 남은 건 설정파일이다. OpenVPN을 소개하는 책이 따로 출판되었을 정도로 OpenVPN은 많은 기능을 제공한다. 여기에서는 TUN 디바이스를 이용해서 step 3 VPN 환경 구축을 할 것이다. 

  1. 설정파일 복사
    예제 설정파일인 /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz을 /etc/openvpn/openvpn.conf로 복사해서 사용하기로 했다.
  2. key 위치 지정. 다음의 key 파일의 위치만 조절해 주면 된다. 현재 우리가 만든 키는 /etc/openvpn/easy-rsa/2.0/keys 디렉토리 밑에 있다.

    ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt 
    cert /etc/openvpn/easy-rsa/2.0/keys/server.crt 
    key /etc/openvpn/easy-rsa/2.0/keys/server.key  # This file should be kept secret 
    dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem 
     
  3. 기타 주요 설정. 주석으로 설명을 대신한다.

    # udp 1194를 사용한다. 
    proto udp 
     
    # tun 디바이스를 사용한다. 
    dev tun 
     
    # 서버 key 값 설정 
    ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt 
    cert /etc/openvpn/easy-rsa/2.0/keys/server.crt 
    key /etc/openvpn/easy-rsa/2.0/keys/server.key  # This file should be kept secret 
    dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem 
     
    # VPN 네트워크 영역을 지정한다. 기본으로 10.8.0.0을 사용한다. 
    server 10.8.0.0  255.255.255.0 
     
    # subnet에 접근하는 것을 허락한다. 
    push "route 10.8.0.0  255.255.255.0" 
     
    client-to-client 
     
  4. 테스트. /etc/init.d/openvpn 스크립트를 이용해도 되지만, 에러 메시지 확인을 위해서 쉘에서 직접 실행했다. 

    # openvpn --config /etc/openvpn/openvpn.conf 
     
  5. 성공적으로 실행했다면, tun 디바이스를 확인할 수 있을 것이다.

    # ifconfig 
    ...... 
    tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00   
              inet addr:10.8.0.1  P-t-P:10.8.0.2  Mask:255.255.255.255 
              UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1 
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
              collisions:0 txqueuelen:100  
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B) 
    ...... 
     

1.4 다른 인증

openvpn은 key 인증외에 PAM 모듈 인증을 허용한다. 그 중 유닉스의 ID/PASSWORD기반의 pam auth 모듈을 기본적으로 제공 한다. 이 모듈을 이용하면, 아이디/패스워드 인증까지 함께 사용할 수 있다. 

서버측 설정파일에 아래 내용을 추가한다.
# so 파일의 경로는 배포판에 따라서 약간식 다를 수 있다. 
plugin /usr/lib/openvpn/openvpn-pam-auth.so login 
 

클라이언트 설정파일에 다음의 내용을 추가한다.
auth-user-pass 
 
이제 vpn 클라이언트를 실행하면, 아이디 패스워드를 묻는 걸 확인할 수 있을 것이다. 

1.5 subnet 이용

VPN server를 gateway로 해서 Gateway가 관리하는 subnet에 접근을 원할 때가 있다. 그림과 같은 경우다. 

pub?id=1CHdD3cArFpSaWugiX1SyKMKo30710Rd0P8FGUF30cE4&w=710&h=229
  • VPN GW의 가상 인터페이스 주소 : 192.168.100.1
  • VPN에서 관리하는 가상 네트워크 주소 : 192.168.100.0
  • VPN GW에서 관리하는 subnet 주소 : 192.168.56.0
원하는 것은 VPN Client가 192.168.56.0의 주소를 가지는 컴퓨터에 접근하도록 하는 것이다. VPN 서버의 설정파일에 아래의 부분을 추가한다. 
push "route 192.168.56.0 255.255.255.0 192.168.100.1" 
 
push는 클라이언트에 설정값을 밀어 넣기 위해서 사용한다. 아래의 명령은 클라이언트로 하여금 다음과 같이 라우팅 테이블을 설정하도록 할 것이다. 
yundream@yundream-desktop:~$ route 
Kernel IP routing table 
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface 
192.168.100.0   192.168.100.1   255.255.255.0   UG    0      0        0 tun0 
192.168.100.0   *               255.255.255.0   U     0      0        0 tun0 
192.168.1.0     *               255.255.255.0   U     2      0        0 wlan0 
192.168.56.0    192.168.100.1   255.255.255.0   UG    0      0        0 tun0 
... 
 

이제 VPN 서버에서 IP forwarding이 가능하도록 설정한다.
  1. ip forwad가 가능하도록 한다.

    # echo 1 > /proc/sys/net/ipv4/ip_forward 
     
  2. ip_forward 값은 리부팅 때마다 기본값인 0으로 재 설정된다. 기본 값을 1로 하고 싶다면, /etc/sysctl.conf에 아래와 같이 설정하면 된다.

    net.ipv4.ip-forward = 1 
     
  3. tun 디바이스를 ip forwarding 가능하도록 한다. 

    # iptables -A INPUT -i tun+ -j ACCEPT 
    # iptables -A FORWARD -i tun+ -j ACCEPT 
     

1.6 OpenVPN 클라이언트 설치

OpenVPN은 클라이언트와 서버 구분이 없이 하나의 프로그램으로 배포된다. 설정파일로 서버로 실행될지 클라이언트로 실행될지가 결정된다.

1.7 OpenVPN 클라이언트 설정

설정은 리눅스와 윈도우 모두 동일하다. 다만 경로 설정 방식에 있어서 차이가 있을 뿐이다. 리눅스 클라이언트 설정파일을 수정해서 쓰면 된다. 유저 이름은 winvpn으로 Openvpn 서버에서 생성한 키 파일이다.
  1. openvpn 환경 설정을 위한 디렉토리를 만든다. 나는 /home/yundream/openvpn 디렉토리를 만들었다.
  2. key를 보관하기 위한 디렉토리를 만들었다. mkdir /home/yundream/openvpn/keys 
  3. 클라이언트 키 파일을 복사해와서 위에서 만든 key 디렉토리에 위치한다. 키 인증 방식이 아닌 ID/PW 인증 방식을 사용할 수도 있는데, 이는 나중에 다뤄볼 생각이다.
  4. openvpn 설정 파일을 만들어야 하는데, 서버 설정파일과 마찬가지로 미리 만들어져 있는 셈플 설정파일을 약간 수정해서 사용하면 된다./usr/share/doc/openvpn/examples/sample-config-files/client.conf파일을 /home/yundream/openvpn 디렉토리로 복사한다음 아래와 같이 수정했다.

    dev tun 
    proto udp 
    ... 
    # openvpn 서버의 주소 정보 
    remote 192.168.55.1 1194 
     
    # 사용할 ip 대역 
    ifconfig 10.8.0.2 10.8.0.1 
     
    # key 위치 
    ca /home/yundream/openvpn/keys/ca.crt 
    cert /home/yundream/openvpn/keys/localvpn1.crt 
    key /home/yundream/openvpn/keys/localvpn1.key 
     

이제 OpenVPN 클라이언트를 실행하면 된다. 
# sudo openvpn --config client.conf 
 
ifconfig로 tun 드라이버를 확인해보자.
# ifconfig 
... 
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00   
          inet addr:10.8.0.6  P-t-P:10.8.0.5  Mask:255.255.255.255 
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1 
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:100  
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B) 
 

윈도우도 리눅스와 동일하다. 설정파일에서 ca 파일의 경로만 다르게 하면 된다. openvpn을 실행하면 tray에 아이콘이 생기는걸 확인할 수 있다. connect를 클릭하면 연결이 진행된다. 성공적으로 실행된 다음에 ipconfig로 확인해 보면 TUN 드라이버가 생긴걸 확인할 수 있을 것이다.
Ethernet adapter 로컬 영역 연결 3: 
 
        Connection-specific DNS Suffix  . : 
        Description . . . . . . . . . . . : TAP-Win32 Adapter V9 
        Physical Address. . . . . . . . . : 00-FF-60-C7-BD-75 
        Dhcp Enabled. . . . . . . . . . . : Yes 
        Autoconfiguration Enabled . . . . : Yes 
        IP Address. . . . . . . . . . . . : 10.8.0.14 
        Subnet Mask . . . . . . . . . . . : 255.255.255.252 
        IP Address. . . . . . . . . . . . : fe80::2ff:60ff:fec7:bd75%4 
        Default Gateway . . . . . . . . . : 
        DHCP Server . . . . . . . . . . . : 10.8.0.13 
        DNS Servers . . . . . . . . . . . : fec0:0:0:ffff::1%1 
                                            fec0:0:0:ffff::2%1 
                                            fec0:0:0:ffff::3%1 
        Lease Obtained. . . . . . . . . . : 2010년 9월 20일 월요일 오후 5:24:35 
        Lease Expires . . . . . . . . . . : 2011년 9월 20일 화요일 오후 5:24:35 
 

서로 연결이 되는지 ping을 이용해서 테스트해 보고, 문제가 없다면 ssh 연결등도 테스트 해보자.

댓글목록

등록된 댓글이 없습니다.

1,139 (1/23P)

Search

Copyright © Cmd 명령어 18.224.63.61